package article9.trywithresources;

import java.io.*;

/**
 * 第9条 try-with-resources 优先于 try-finally
 * 根据经验，try-finally语句是确保资源会被适时关闭的最佳方法，就算发生异常或者返回也一样。
 * 但是也有不足因为在try块和finally块中的代码，都会抛出异常。书中举例如果是物理设备异常 try和finally都回抛出相同的异常而且查不到第一个异常
 * Java 引人 try-with-resources 语
 * try-with-resources语句，在使用必须关闭的资源时，就能更轻松地正确编写代码了,实践证明这个用try-finally是不可能做到的
 *
 * @Author: cctv
 * @Date: 2019/3/29 15:48
 */
public class Demo {
    private static final int BUFFER_SIZE = 1024;

    /**
     * 读文件第一行 try-finally方法
     *
     * @param path 文件路径
     * @return
     * @throws IOException
     */
    static String firstLineOfFile(String path) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path));
        try {

            return br.readLine();
        } finally {
            br.close();
        }
    }


    /**
     * 读文件第一行  try-with-resource方法
     *
     * @param path 文件路径
     * @return
     * @throws IOException
     */
    static String firstLineOfFile1(String path) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            return br.readLine();
        }
    }

    static void copy(String src, String dst) throws IOException {
        try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst)) {
            byte[] buf = new byte[BUFFER_SIZE];
            int n;
            while ((n = in.read(buf)) > 0) {
                out.write(buf, 0, n);
            }
        }
    }

    /**
     * 读文件第一行  try-with-resource方法
     * 这个 firstLineOfFile 方法没有抛出异常 但是如果它无法打开文件，或者无法从中读取，就会返回一个默认值：
     * @param path
     * @param defaultVal
     * @return
     */
    static String firstLineOfFile2(String path, String defaultVal) {
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            return br.readLine();
        } catch (IOException e) {
            return defaultVal;
        }

    }
}
